package mem

import "fmt"

// 对外应用层使用的 GBuf
type GBuf struct {
	b *Buf
}

// Clear 清空内存，移交回内存池管理
func (gb *GBuf) Clear() {
	if gb.b != nil {
		GetBufPoolInstance().Revert(gb.b)
		gb.b = nil
	}
}

// Pop 清除 len 的有效长度
func (gb *GBuf) Pop(len int) {
	if gb.b == nil || gb.b.Length() < len {
		return
	}
	gb.b.Pop(len)

	// 如果内存没空间被利用，放回内存池管理
	if gb.b.Length() == 0 {
		GetBufPoolInstance().Revert(gb.b)
		gb.b = nil
	}
}

// Data 获取内存有效使用的字节数据值
func (gb *GBuf) Data() []byte {
	if gb.b == nil {
		return nil
	}
	return gb.b.GetBytes()
}

// Adjust 调整内存占用空间
func (gb *GBuf) Adjust() {
	if gb.b != nil {
		gb.b.Adjust()
	}
}

// Read 读入数据填充进内存字节数组中
func (gb *GBuf) Read(src []byte) (err error) {
	if gb.b == nil {
		gb.b, err = GetBufPoolInstance().Alloc(len(src))
		if err != nil {
			fmt.Println("Pool Alloc Error:", err)
			return err
		}
	} else {
		// 容量不够，申请新内存，归还旧内存
		if gb.b.Capacity-(gb.b.Head()+gb.b.Length()) < len(src) {
			newBuf, err := GetBufPoolInstance().Alloc(len(src) + gb.b.Length())
			if err != nil {
				fmt.Println("Pool Alloc Error:", err)
				return err
			}
			newBuf.Copy(gb.b)
			GetBufPoolInstance().Revert(gb.b)
			gb.b = newBuf
		}
	}

	// 数据写入 GBuf 缓存中
	gb.b.SetBytes(src)
	return nil
}
